package com.xin.bi.utils;

import cn.hutool.core.io.FileUtil;
import com.alibaba.excel.EasyExcel;
import com.google.gson.Gson;
import com.xin.bi.exception.BusinessException;
import com.xin.bi.model.dto.chart.GenChartByAiRequest;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ExcelUtils {
    /**
     * excel转csv格式，目的是为了压缩数据
     *
     * @param multipartFile
     * @return
     */
    public static final long TOW_MB = 2 * 2024 * 1024L;

    public static String excelTOCSV(MultipartFile multipartFile) {
        // 限制文件的后缀 只允许上传.xls和.xlsx文件
        String suffix = FileUtil.getSuffix(multipartFile.getOriginalFilename());
        if (!"xlsx".equals(suffix) && !"xls".equals(suffix)) {
            throw new BusinessException("文件后缀有误");
        }
        //  限制不能超过2mb todo 根据实际情况进行修改
        long size = multipartFile.getSize();
        if (size  > TOW_MB) {
            throw new BusinessException("文件太大");
        }
        // todo 限制文件内容 这个一般需要使用第三方服务
        StringBuilder res = new StringBuilder();
        List<Map<Integer, String>> listMap = null;
        try {
            listMap = EasyExcel.read(multipartFile.getInputStream()).sheet().headRowNumber(0).doReadSync();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // excel数据为空
        if (CollectionUtils.isEmpty(listMap)) {
            throw new BusinessException("excel文件有误");
        }
        LinkedHashMap<Integer, String> headerExcel = (LinkedHashMap) listMap.get(0);
        // 过滤掉为null的数据
        List<String> headNotNUllListExcel = headerExcel.values().stream().filter(s -> s != null).collect(Collectors.toList());
        // 拼接
        res.append(StringUtils.join(headNotNUllListExcel, ",")).append("\n");
        for (int i = 1; i < listMap.size(); i++) {
            //过滤为null
            List<String> listNotNull = listMap.get(i).values().stream().filter(s -> s != null).collect(Collectors.toList());
            res.append(StringUtils.join(listNotNull, ",")).append("\n");
        }

        return res.toString();
    }
}
